﻿using System;
using SIGEB.Prototipo.Vista.moduloDocumentos;
using SIGEB.Prototipo.Vista.moduloEstadisticas;
using SIGEB.Prototipo.Vista.moduloMultas;
using SIGEB.Prototipo.Vista.moduloGrupo;
using SIGEB.Prototipo.Vista.moduloPerfiles;
using SIGEB.Prototipo.Vista.moduloPrestamosDevoluciones;
using SIGEB.Prototipo.Vista.moduloTipoDocumentos;
using SIGEB.Prototipo.Vista.moduloUsuarios;
using SIGEB.Prototipo.Vista.moduloComputadoras;
using SIGEB.Prototipo.Vista.moduloTipoUsuario;
using SIGEB.Prototipo.Vista.moduloConsulta;
using SIGEB.Prototipo.Vista.moduloNotificaciones;
using SIGEB.Prototipo.Vista;
using SIGEB.Modelo.moduloUsuarios;
using SIGEB.Modelo;
using bibliotecaObservador;
using configFileCreator;

namespace SIGEB.Prototipo.Control
{
    public class controlPrincipal
    {
        #region"constructor"

        public controlPrincipal()
        {
            ctrlConfiguracion = new controlConfiguration("SIGEB", "dbConfig.config");
            string[] cnx = ctrlConfiguracion.conexionData();
            try
            {
                datos = new datosAplicacion(cnx[0], cnx[1], cnx[2], cnx[3], cnx[4]);
            }
            catch (Exception ex)
            {
                ctrlConfiguracion.errorConfiguracion();
                throw ex;
            }
            iniciaControles();
        }

        public controlPrincipal(controlPrincipal controlPrincipal_2)
        {
            // TODO: Complete member initialization
        }

        #endregion

        #region "MétodosControles"

        private void iniciaControles()
        {
            ctrlDocumentos = new controlDocumentos(this);
            ctrlEditorial = new controlEditorial(this);
            ctrlPrestamo = new controlPrestamo(this);
            ctrlTipoDoc = new controlTipoDocumento(this);
            ctrlUsuario = new controlUsuarios(this);
            ctrlTipoPerfil = new controlTipoPerfil(this);
            ctrlTipoUsuario = new controlTipoUsuario(this);
            ctrlGrupos = new controlGrupos(this);
            ctrlEstadisticas=new controlEstadisticas(this);
            ctrlInfoComputadoras = new controlInfoComputadoras(this);
            ctrlReservas = new controlReservas(this);
            ctrlAutores = new controlAutores(this);
            ctrlEjemplares = new controlEjemplares(this);
            ctrlNotificaciones = new controlNotificaciones(this);
            ctrlMultas = new controlMultas(this);
        }

        #endregion

        #region "metodos ventanas"

        public void abrirVentana(frm_Base procedente, int ventanaDeseada, object[] args)
        {
            frm_Base Deseada = DevuelveTipoVentana(ventanaDeseada);
            if (Deseada == null)
            {
                iniciarVentana(ventanaDeseada);
                Deseada = DevuelveTipoVentana(ventanaDeseada);
            }
            if (ventanaDeseada == VENTANA_LOGIN)
            {
                Deseada.ShowDialog();
            }
            else
            {
                Deseada.hacerVisibleBase(args);
            }
        }

        internal void cerrarTodasVentanas()
        {
            for (int i = 3; i < NUMERO_VENTANAS; i++)
            {
                if (DevuelveTipoVentana(i) != null)
                {
                    DevuelveTipoVentana(i).ocultar();
                }
            }
        }

        private void OcultarTodasVentanas()
        {
            throw new NotImplementedException();
        }

        private frm_Base DevuelveTipoVentana(int ventanaDeseada)
        {
            switch (ventanaDeseada)
            {
                case 1: return ventanaPrincipal;
                case 2: return ventanaLogin;
                case 3: return ventanaComputadoras;
                case 5: return ventanaConsultas;
                case 6: return ventanaDocumentos;
                case 7: return ventanEstadisticas;
                case 8: return ventanaReporteEstadisticas;
                case 9: return ventanaGrupos;
                case 10: return ventanaAreas;
                case 11: return ventanaMultas;
                case 12: return ventanaNotificaciones;
                case 13: return ventanaPerfiles;
                case 14: return ventanaPrestamoDevolucion;
                case 15: return ventanaPrevia;
                case 16: return ventanaCaracteresEspeciales;
                case 17: return ventanaCondiciones;
                case 18: return ventanaTipoDocumento;
                case 19: return ventanaTipoUsuario;
                case 20: return ventanaUsuario;
                case 22: return ventanaPrestamosBusquedaUsuarios;
                case 23: return ventanaAutores;
                case 24: return ventanaEditorial;
                case 25: return ventanaEjemplares;
                case 26: return ventanaReservas;
                case 27: return ventanaVistaGrafico;
                case 28: return ventanaPrestamos;
                case 29: return ventanaVistaPreviaCodigos;
                default: return null;//throw new Exception("ventana inválida");
            }
        }

        private void iniciarVentana(int ventanaDeseada)
        {
            switch (ventanaDeseada)
            {
                case 1:
                    ventanaPrincipal = new frm_Principal(this);
                    break;
                case 2: ventanaLogin = new frm_Login(this);
                    break;
                case 3: ventanaComputadoras = new frm_Computadoras(this);
                    break;
                case 5: ventanaConsultas = new frm_Consultas(this);
                    break;
                case 6: ventanaDocumentos = new frm_Documentos(this);
                    break;
                case 7: ventanEstadisticas = new frm_Estadisticas(this);
                    break;
                case 8: ventanaReporteEstadisticas = new frm_ReporteEstadistico(this);
                    break;
                case 9: ventanaGrupos = new frm_Grupos(this);
                    break;
                case 10: ventanaAreas = new frm_Grupos(this);
                    break;
                case 11: ventanaMultas = new frm_Multas(this);
                    break;
                case 12: ventanaNotificaciones = new frm_EnviarNotificacion(this);
                    break;
                case 13: ventanaPerfiles = new frm_TipoPerfil(this);
                    break;
                case 14: ventanaPrestamoDevolucion = new frm_PrestamoDevolucion(this);
                    break;
                case 15: ventanaPrevia = new frm_VistaPrevia(this);
                    break;
                case 16: ventanaCaracteresEspeciales = new frm_caractEspeciales(this);
                    break;
                case 17: ventanaCondiciones = new frm_Condiciones(this);
                    break;
                case 18: ventanaTipoDocumento = new frm_TipoDocumento(this);
                    break;
                case 19: ventanaTipoUsuario = new frm_tipoUsuarios(this);
                    break;
                case 20: ventanaUsuario = new frm_Usuarios(this);
                    break;
                case 22: ventanaPrestamosBusquedaUsuarios = new frm_BusquedaUsuarios(this);
                    break;
                case 23: ventanaAutores = new frm_autor(this);
                    break;
                case 24: ventanaEditorial = new frm_Editorial(this);
                    break;
                case 25: ventanaEjemplares = new frm_Ejemplares(this);
                    break;
                case 26: ventanaReservas = new form_ReservasUsuario(this);
                    break;
                case 27: ventanaVistaGrafico = new frm_VistaGrafico(this);
                    break;
                case 28: ventanaPrestamos = new form_Prestamos(this);
                    break;
                case 29: ventanaVistaPreviaCodigos = new frm_vistaPreviaCodigos(this);
                    break;
                default: throw new Exception("ventana inválida");
            }
        }

        internal void abrirLogin()
        {
            if (DevuelveTipoVentana(VENTANA_LOGIN) == null)
            {
                iniciarVentana(VENTANA_LOGIN);
            }

        }

        internal void registraObservador(IObservador nuevoObservador)
        {
            datos.registrarObservador(nuevoObservador);
        }

        #endregion

        #region "numeroVentanas"

        internal static int VENTANA_PRINCIPAL = 1;
        internal static int VENTANA_LOGIN = 2;
        internal static int VENTANA_COMPUTADORAS = 3;
        internal static int VENTANA_COMPUTADORAS_USUARIO_CONTRASENA = 4;
        internal static int VENTANA_CONSULTA = 5;
        internal static int VENTANA_DOCUMENTOS = 6;
        internal static int VENTANA_ESTADISTICA = 7;
        internal static int VENTANA_REPORTE_ESTADISTICO = 8;
        internal static int VENTANA_GRUPOS = 9;
        internal static int VENTANA_AREAS = 10;
        internal static int VENTANA_MULTAS = 11;
        internal static int VENTANA_NOTIFICACIONES = 12;
        internal static int VENTANA_PERFILES = 13;
        internal static int VENTANA_PRESTAMO_DEVOLUCION = 14;
        internal static int VENTANA_VISTA_PREVIA_PD = 15;
        internal static int VENTANA_CARACTERES_ESPECIALES = 16;
        internal static int VENTANA_CONDICIONES = 17;
        internal static int VENTANA_TIPODOCUMENTO = 18;
        internal static int VENTANA_TIPO_USUARIO = 19;
        internal static int VENTANA_USUARIO = 20;
        internal static int VENTANA_PRESTAMOS_BUSQUEDA_DOCUMENTOS = 21;
        internal static int VENTANA_PRESTAMOS_BUSQUEDA_USUARIOS = 22;
        internal static int VENANTA_AUTORES = 23;
        internal static int VENANTA_EDITORIAL = 24;
        internal static int VENTANA_EJEMPLARES = 25;
        internal static int VENTANA_RESERVAS = 26;
        internal static int VENTANA_VISTA_GRAFICO = 27;
        internal static int VENTANA_PRESTAMOS = 28;
        internal static int NUMERO_VENTANAS = 28;
        internal static int VENTANA_VISTA_PREVIA_CODIGOS = 29;

        #endregion

        #region "usuarioActual"

        internal usuario usuarioActual()
        {
            if (UsuarioActual != null)
            {
                try
                {
                    return datos.usuarios.obtenerusuario(UsuarioActual);
                }
                catch
                {
                    return null;
                }
            }
            return null;
        }

        internal bool usuarioActualPuede(int accion)
        {
            if (validarPermisosUsuario)
            {
                try
                {
                    return usuarioActual().puede(accion);
                }
                catch
                {
                    return false;
                }
            }
            return true;
        }

        internal void ExcepcionUsrSinPermisos()
        {
            throw new Exception("El usuario actual no tiene permisos para realizar esta acción");
        }

        internal void setNuevoUsuario(String id)
        {
            if (ctrlUsuario.existeUsuario(id))
            {
                UsuarioActual = id;
                validarPermisosUsuario = true;
            }
            else
            {
                throw new Exception("No existe el usuario: " + id);
            }
        }

        #endregion
            
        #region "atributos"

        internal datosAplicacion datos;

        internal String UsuarioActual
        {
            private set;
            get;
        }

        internal bool validarPermisosUsuario = false;

        #region "ventanas"

        frm_Principal ventanaPrincipal;
        frm_Login ventanaLogin;
        frm_Computadoras ventanaComputadoras;
        frm_Consultas ventanaConsultas;
        frm_Documentos ventanaDocumentos;
        frm_Estadisticas ventanEstadisticas;
        frm_ReporteEstadistico ventanaReporteEstadisticas;
        frm_Grupos ventanaGrupos;
        frm_Grupos ventanaAreas;
        frm_Multas ventanaMultas;
        frm_EnviarNotificacion ventanaNotificaciones;
        frm_TipoPerfil ventanaPerfiles;
        frm_PrestamoDevolucion ventanaPrestamoDevolucion;
        frm_VistaPrevia ventanaPrevia;
        frm_caractEspeciales ventanaCaracteresEspeciales;
        frm_Condiciones ventanaCondiciones;
        frm_TipoDocumento ventanaTipoDocumento;
        frm_tipoUsuarios ventanaTipoUsuario;
        frm_Usuarios ventanaUsuario;
        frm_BusquedaUsuarios ventanaPrestamosBusquedaUsuarios;
        frm_autor ventanaAutores;
        frm_Editorial ventanaEditorial;
        frm_Ejemplares ventanaEjemplares;
        form_ReservasUsuario ventanaReservas;
        frm_VistaGrafico ventanaVistaGrafico;
        form_Prestamos ventanaPrestamos;
        frm_vistaPreviaCodigos ventanaVistaPreviaCodigos;

        #endregion

        #region "controles"

        internal controlDocumentos ctrlDocumentos;
        internal controlEditorial ctrlEditorial;
        internal controlPrestamo ctrlPrestamo;
        internal controlTipoDocumento ctrlTipoDoc;
        internal controlUsuarios ctrlUsuario;
        internal controlTipoPerfil ctrlTipoPerfil;
        internal controlTipoUsuario ctrlTipoUsuario;
        internal controlGrupos ctrlGrupos;
        internal controlEstadisticas ctrlEstadisticas;
        internal controlInfoComputadoras ctrlInfoComputadoras;
        internal controlReservas ctrlReservas;
        internal controlAutores ctrlAutores;
        internal controlEjemplares ctrlEjemplares;
        internal controlNotificaciones ctrlNotificaciones;
        internal controlMultas ctrlMultas;
        controlConfiguration ctrlConfiguracion;

        #endregion

        #region "tipo de login"

        internal static int TODOS = 2;
        internal static int ACTUAL = 1;
        internal static int NADA = 0;

        #endregion

        #endregion
    }
}